
abstract class Shape {
    //不用实现的函数
    public abstract void draw();

    public void func() {

    }

    public static int a = 10;

}

/**
 * 1.抽象类使用abstract修饰类。
 * 2.抽象类当中可以包含普通类所能包含的成员。
 * 3.抽象类和普通类不一样的是，抽象类当中可以包含抽象方法。
 * 4.抽象方法是使用abstract修饰的。这个方法没有具体的实现
 * 类当中的成员。
 * 5.不能实例化抽象类 new
 * 6.抽象类存在的最大的意义就是为了被继承。
 * 其实很多语法的出现都是为了能够让程序员更早的发现错误。
 * 7.如果一个普通类继承了个抽象类此时必须重写抽象类当中的方法。
 * 8.如果-个抽象类A继承了一个抽象类B,此时A当中不需要重写B中的抽象方法。但是如果A再被普通类继
 *承，就需要重写。
 * 9.抽象方法不能是私有static。 也就是要满足重写的规则。
 * 10. final可以吗?不可以他和abstract是矛盾的
 * 11.抽象类当中可以有构造方法。为了方便子类能够调用， 来初始化抽象
 */

/**
 * 接口通过上述例子可以看出:接口就是公共的行为规范标准，大家在实现时，只要符合规范标准，就可以通用
 * 在Java中，接口可以看成是:多个类的公共规范,是一种引用数据类型。
 */

//接口
interface IShape {
    //在接口里面只能有抽象方法
    int size = 10;//public static final

    public static void func2() {
        System.out.println("public static void func2()");
    }

    default void print() {
        System.out.println("default void print()");
    }

    //不写也是默认抽象方法
    void func();

    public abstract void draw();//public abstract
}

/**
 * 1.使用interface来修饰接口
 * 2.接口当中的成员方法,不能有具体的实现。public
 * 1.抽象方法:默认是public abstract的方法
 * 2. JDK1.8开始允许有可以实现的方法，但是这个方法只能是由default修饰的。
 * 3.可以实现有一个静态方法。
 * 3.成员变量默认是public static final 修饰的
 * 4.接口不能被实例化。
 * 5.类和接口之间采用implements来实现多个接口
 * 6.子类重写抽象方法，必须加上public。
 * 7.接口中不能有静态代码块和构造方法
 * 8.如果你不想实现接口的方法，那么就把这个类定义为抽象类。但是
 * 如果这个类被其他类继承那么必须重写。
 * 9.一个类可以实现多个接口。使用implements用逗号隔开。[可以解决多继承的问题]
 */

class A implements IShape {

    @Override
    public void draw() {
        System.out.println("必须重写！");
    }

    @Override
    public void func() {
        System.out.println("zhege1");
    }

    @Override
    public void print() {
        System.out.println("这个方法的重写 重写是以可选择的");
    }
}

//接口不能被实例化
public class Test {
    public static void main(String[] args) {

    }
}